package org.csu.softwaremetrics_demo.entity.executor;

import org.csu.softwaremetrics_demo.util.ColorLoggerUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;


/**
 * 代码行数计算器
 * 用于计算源代码文件的有效代码行数（LOC, Lines of Code）
 * <p>
 * 特点：
 * 1. 忽略空行（只包含空格和制表符的行）
 * 2. 支持从输入流读取源代码
 * 3. 提供错误处理和日志记录
 *
 * </p>
 */
public class LOCCalculator {

	private static ColorLoggerUtils logger = ColorLoggerUtils.getLogger(LOCCalculator.class);

	/**
	 * 计算源代码的有效行数
	 * 逐行读取源代码，统计非空行的数量
	 *
	 * @param sourceCode 包含源代码的输入流
	 * @return 有效代码行数，发生IO错误时返回0
	 */
	public int calculate(InputStream sourceCode) {

		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(sourceCode));
			int lines = 0;

			String line = null;
			do {
				line = reader.readLine();
				if(line!=null && !empty(line)) lines++;
			}
			while (line != null);
			reader.close();

			return lines;
		} catch (IOException e) {
			logger.error(e);
			return 0;
		}
	}

	/**
	 * 判断一行代码是否为空行
	 * 移除所有制表符和空格后检查是否为空
	 *
	 * @param line 要检查的代码行
	 * @return 如果是空行返回true，否则返回false
	 */
	private boolean empty(String line) {
		String result = line.replace("\t", "").replace(" ", "").trim();
		return result.isEmpty();
	}

}
